package TestDemo;

/**
 详解：
 1.正确的向下转型
 Fruit a=new Apple(); //向上转型
 a.myName();
 Apple aa=(Apple)a; //向下转型,编译和运行皆不会出错(正确的)
 aa.myName();
 aa.myMore();
 a指向子类的对象，所以子类的实例aa也可以指向a啊~~
 向下转型后因为都是指向子类对象，所以调用的当然全是子类的方法~~
 2.不安全的向下转型
 Fruit f=new Fruit();
 Apple aaa=(Apple)f; //-不安全的---向下转型,编译无错但会运行会出错
 aaa.myName();
 aaa.myMore();
 f是父类对象，子类的实例aaa肯定不能指向父类f啊~~~
 3.Java为了解决不安全的向下转型问题，引入泛型的概念
 4.为了安全的类型转换，最好先用 if(A instanceof  B) 判断一下下~~
 */
    class Fruit
    {
        public void myName()
        {
            System.out.println("我是父类  水果...");
        }
    }

    class Apple extends Fruit
    {
        @Override
        public void myName()
        {
            System.out.println("我是子类  苹果...");
        }
        public void myMore()
        {
            System.out.println("我是你的小呀小苹果~~~~~~");
        }
    }

    public class InstanceDown{
        public static void main(String[] args) {
            Fruit a=new Apple(); //向上转型
            a.myName();

            Apple aa=(Apple)a; //向下转型,编译和运行皆不会出错(正确的)
            aa.myName();//向下转型时调用的是子类的
            aa.myMore();;

            Fruit f=new Fruit();
            Apple aaa=(Apple)f; //-不安全的---向下转型,编译无错但会运行会出错
            aaa.myName();
            aaa.myMore();
        }
    }
